package com.example.animator;

import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.AnticipateInterpolator;
import android.view.animation.AnticipateOvershootInterpolator;
import android.view.animation.BounceInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.LinearInterpolator;
import android.view.animation.Transformation;

/**
 * created by liangkun on ${DATA}
 * Describe:3D旋转效果动画
 */

public class Custom3DAni extends Animation {
    private int mCenterWidth, mCenterHeight;
    private Camera mCamera = new Camera();
    private float mRotateY = 0.0f;

    // 一般在此方法初始化一些动画相关的变量和值
    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        // 设置默认时长
        setDuration(4000);
        // 保持动画的结束状态
        setFillAfter(true);

        // 设置默认插值器
//        setInterpolator(new BounceInterpolator());// 回弹效果的插值器
        setInterpolator(new AccelerateDecelerateInterpolator());//其变化开始和结束速率较慢，中间加速
//        setInterpolator(new AccelerateInterpolator());//其变化开始速率较慢，后面加速
//        setInterpolator(new DecelerateInterpolator());//其变化开始速率较快，后面减速
//        setInterpolator(new LinearInterpolator());//	其变化速率恒定
//        setInterpolator(new AnticipateInterpolator());//	其变化开始向后甩，然后向前
//        setInterpolator(new AnticipateOvershootInterpolator());//	其变化开始向后甩，然后向前甩，过冲到目标值，最后又回到了终值
//        mCenterWidth = width / 2;
//        mCenterHeight = height / 2;



        mCenterWidth = width;
        mCenterHeight = height ;
    }

    // 暴露接口设置旋转角度
    public void setRotateY(float rotateY) {
        mRotateY = rotateY;
    }

    // 自定义动画的核心，在动画的执行过程中会不断回调此方法，并且每次回调interpolatedTime值都在不断变化(0----1)
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        final Matrix matrix = t.getMatrix();
        mCamera.save();
        // 使用Camera设置Y轴方向的旋转角度
        mCamera.rotateY(mRotateY * interpolatedTime);
        // 将旋转变化作用到matrix上
        mCamera.getMatrix(matrix);
        mCamera.restore();
        // 通过pre方法设置矩阵作用前的偏移量来改变旋转中心
//        matrix.preTranslate(mCenterWidth, mCenterHeight);// 在旋转之前开始位移动画
//        matrix.postTranslate(-mCenterWidth, -mCenterHeight);// 在旋转之后开始位移动画
//        matrix.postTranslate(-mCenterWidth+180, -mCenterHeight+180);// 在旋转之后开始位移动画


        matrix.preTranslate(0, -mCenterHeight);
        matrix.postTranslate(0,mCenterHeight);
    }

}
